home *** CD-ROM | disk | FTP | other *** search
/ The Very Best of Atari Inside / The Very Best of Atari Inside 1.iso / mint / mntlib43 / mntlib / wait.c < prev    next >
C/C++ Source or Header  |  1993-10-26  |  1KB  |  60 lines

  1. /*
  2.  * wait.c: a version of wait() for MiNT
  3.  */
  4.  
  5. #include <types.h>
  6. #include <wait.h>
  7. #include <errno.h>
  8. #include <signal.h>
  9. #include <osbind.h>
  10. #include <mintbind.h>
  11.  
  12. /* under TOS, vfork() puts its result in __waitval */
  13. extern long __waitval;    /* in thread.c */
  14.  
  15. pid_t wait(_status)
  16.     __WP _status;
  17. {
  18.     long r;
  19.     int exit_status, sig_term, pid;
  20.     extern int __mint;
  21. #ifdef _EXPERIMENTAL_WAIT_MACROS
  22.     int *status = _status.__wi;
  23. #else    
  24.     int *status = _status;
  25. #endif
  26.  
  27.     if (__mint == 0) {    /* wait is faked by vfork() */
  28.         r = __waitval;
  29.         __waitval = -ENOENT;
  30.     }
  31.     else
  32.         r = Pwaitpid(-1, 0, 0L);
  33.  
  34.     if (r < 0) {
  35.         errno = (int) -r;
  36.         return -1;
  37.     }
  38.     pid = (int) ((r & 0xffff0000L) >> 16);
  39.     exit_status = (int) (r & 0x000000ffL);
  40.     sig_term = (int) ((r & 0x00007f00L) >> 8);
  41.     if (sig_term >= NSIG)
  42.       sig_term = 0;
  43.     if (status) {
  44.         *status = (exit_status << 8) | sig_term;
  45.     }
  46.     return pid;
  47. }
  48.  
  49. #ifdef TEST
  50. /* small test for parameter of wait */
  51. void a()
  52. {
  53.     union wait u;
  54.     int i;
  55.     
  56.     wait(&u);
  57.     wait(&i);
  58. }
  59. #endif
  60.